package com.mxx.common.thread;

import java.util.List;
import java.util.function.BiConsumer;

/**
 * @Auther: Mr. Zeng
 * @Date: 2020/6/9 18:44
 * @Description: 批处理工具类
 */
public class BatchProcess {
    /**
     * 应用线程池
     */
    private static ThreadHelper threadHelper;


    public BatchProcess(ThreadHelper threadHelper) {
        this.threadHelper = threadHelper;
    }


    /**
     * @param metaData    待处理的元数据
     * @param batchNumber 每次处理的大小
     * @param consumer    执行方法  T 元对象 ，Integer 当前数据在所有数据中的索引位置
     * @param <T>
     */

    public <T> void async(List<T> metaData, int batchNumber, BiConsumer<T, Integer> consumer) {
        int start = 0;
        int end = batchNumber;
        while (start < metaData.size()) {
            if (end >= metaData.size()) {
                end = metaData.size();
            }
            threadHelper.exec(new Batch(metaData.subList(start, end), start, consumer));
            start = end;
            end += batchNumber;
        }
    }

    /**
     * @param metaData    待处理的元数据
     * @param batchNumber 每次处理的大小
     * @param consumer    执行方法  T 批量元对象 ，Integer 当前批次在所有数据中的起始位置
     * @param <T>
     */

    public <T> void asyncList(List<T> metaData, int batchNumber, BiConsumer<List<T>, Integer> consumer) {
        int start = 0;
        int end = batchNumber;
        while (start < metaData.size()) {
            if (end >= metaData.size()) {
                end = metaData.size();
            }
            threadHelper.exec(new BatchList<>(metaData.subList(start, end), start, consumer));
            start = end;
            end += batchNumber;
        }
    }


}
